package fr.afcepf.atod19.dreamproject.dtoutils;

import fr.afcepf.atod19.dreamproject.dto.*;
import fr.afcepf.atod19.dreamproject.entity.*;
import org.springframework.beans.BeanUtils;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class EntityToDTOConverter {

    public static List<ReveDTO> getRevesDTO(List<Reve> reves) {

        List<ReveDTO> revesDTO = new ArrayList<ReveDTO>();

        for (int i = 0; i < reves.size(); i++) {
            Reve reve = reves.get(i);
            ReveDTO reveDTO = getReveDTO(reve);

            revesDTO.add(reveDTO);
        }

        return revesDTO;

    }

    public static List<CategorieReveDTO> getCategoriesRevesDTO(List<CategorieReve> categorieReves) {

        List<CategorieReveDTO> categorieRevesDTO = new ArrayList<CategorieReveDTO>();

        for (int i = 0; i < categorieReves.size(); i++) {
            CategorieReve categorieReve = categorieReves.get(i);

            CategorieReveDTO categorieReveDTO = getCategoriesReveDTO(categorieReve);

            categorieRevesDTO.add(categorieReveDTO);
        }

        return categorieRevesDTO;
    }

    public static CategorieReveDTO getCategoriesReveDTO(CategorieReve categorieReve) {

        CategorieReveDTO categorieReveDTO = new CategorieReveDTO();
        BeanUtils.copyProperties(categorieReve, categorieReveDTO);

//        if (categorieReve.getCategorieReves() != null) {
//            for (int i = 0; i < categorieReve.getCategorieReves().size(); i++) {
//                CategorieReve categorieReveChild = categorieReve.getCategorieReves().get(i);
//                CategorieReveDTO categorieReveDTOChild = getCategoriesReveDTO(categorieReveChild);
//
//                categorieReveDTO.getCategorieRevesDTO().add(categorieReveDTOChild);
//            }
//        }

        return categorieReveDTO;
    }

    public static ReveDTO getReveDTO(Reve reve){
        ReveDTO reveDTO = new ReveDTO();
        BeanUtils.copyProperties(reve, reveDTO);

        if (reve.getCategorieReves() != null) {
            for (int j = 0; j < reve.getCategorieReves().size(); j++) {
                CategorieReveDTO categorieReveDTO = new CategorieReveDTO();
                CategorieReve categorieReve = reve.getCategorieReves().get(j);

                BeanUtils.copyProperties(categorieReve, categorieReveDTO);

                reveDTO.getCategorieRevesDTO().add(categorieReveDTO);
            }
        }
        return reveDTO;
    }

    public static ClientDTO getClientDTOWithAdresses(Client client){
        ClientDTO clientDTO = new ClientDTO();
        if (client != null) {
            BeanUtils.copyProperties(client, clientDTO);
            clientDTO.setDateNaissanceString(getDateString(client.getDateNaissance()));
            for(int i = 0 ; i < client.getAdresses().size() ; i++){
                Adresse adresse = client.getAdresses().get(i);
                AdresseDTO adresseDTO = getAdresseDTO(adresse);
                clientDTO.getAdressesDTO().add(adresseDTO);
            }
        }
        return clientDTO;
    }

    public static ClientDTO getClientDTO(Client client){
        ClientDTO clientDTO = new ClientDTO();
        if (client != null) {
            BeanUtils.copyProperties(client, clientDTO);
            clientDTO.setDateNaissanceString(getDateString(client.getDateNaissance()));
        }
        return clientDTO;
    }

    public static AdresseDTO getAdresseDTO(Adresse adresse){
        AdresseDTO adresseDTO = new AdresseDTO();
        BeanUtils.copyProperties(adresse, adresseDTO);
        return adresseDTO;
    }

    public static CommentaireDTO getCommentaireDTO(Commentaire commentaire){
        CommentaireDTO commentaireDTO = new CommentaireDTO();

        BeanUtils.copyProperties(commentaire, commentaireDTO);
        commentaireDTO.setClientDTO(getClientDTO(commentaire.getClient()));

        return commentaireDTO;
    }

    public static List<CommentaireDTO> getListeCommentairesDTO(List<Commentaire> commentaires){
        List<CommentaireDTO> commentaireDTOs = new ArrayList<CommentaireDTO>();

        for(int i = 0; i < commentaires.size(); i++){
            Commentaire commentaire = commentaires.get(i);
            CommentaireDTO commentaireDTO = getCommentaireDTO(commentaire);
            commentaireDTOs.add(commentaireDTO);
        }

        return commentaireDTOs;
    }

    private static String getDateString(Date date) {
        // Create an instance of SimpleDateFormat used for formatting
        // the string representation of date (month/day/year)
        if(date == null){
            return null;
        }
        DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
        String strDate = df.format(date);
        return strDate;
    }

}
